package com.i2863.shiroDemo.util;

import org.apache.http.impl.client.CloseableHttpClient;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;

/**
 * @author xuweiwei
 * @date 2018/6/7
 */
public class RandomUtil {

    private static final CloseableHttpClient HTTPS = HttpSessionUtils.buildHttpClient();
    private static final SecureRandom SECURE_RANDOM = new SecureRandom();

    /**
     * 产生一个整数随机数
     * @param min 最小值
     * @param max 最大值
     * @return 整数随机数
     */
    public static int randomInt(int min, int max) {
        if (max <= min) {
            throw new RuntimeException("max<=min");
        }
        int n = max - min + 1;
        try {
            return (int) (SECURE_RANDOM.nextDouble() * n) % n + min;
        } catch (Exception e) {
            return (int) (Math.random()* Math.random() * n) % n + min;
        }
    }

    /**
     * 产生一个从最小值到最大值的有序数列
     * @param min 最小值
     * @param max 最大值
     * @return 有序数列
     */
    public static int[] sequences(int min, int max) {
        String url = "https://www.random.org/sequences/?min=" + min + "&max=" + max + "&col=1&format=plain&rnd=new";
        String content = HttpSessionUtils.httpGet(HTTPS, url);
        if (content.contains("Error:")) {
            throw new RuntimeException("error:" + content);
        }
        String[] lines = content.split("\n");
        int[] nums = new int[max - min + 1];
        if (lines.length < nums.length) {
            throw new RuntimeException("illegal random:" + content);
        }
        int i = 0;
        for (String line : lines) {
            nums[i++] = Integer.parseInt(line);
        }
        return nums;
    }

    /**
     * 随机提取指定数量的元素,使用java的随机数算法
     *
     * @param list 集合
     * @param size 提取数量
     * @return 随机提取出来的元素集合
     */
    public static <T> List<T> randomByOriginal (List<T> list, int size) {
        List<T> copy = new ArrayList<T>(list);
        List<T> result = new ArrayList<T>();

        for (int i = 0; i < size; i++) {
            int num = randomInt(0, copy.size() - 1);
            result.add(copy.remove(num));
        }
        return result;
    }

    /**
     * 随机提取指定数量的元素,使用random.org网站的接口
     *
     * @param list 集合
     * @param size 提取数量
     * @return 随机提取出来的元素集合
     */
    public static <T> List<T> randomByApi(List<T> list, int size) {
        int[] nums = sequences(0, list.size() - 1);
        List<T> result = new ArrayList<T>();
        for (int i = 0; i < size; i++) {
            result.add(list.get(nums[i]));
        }
        return result;

    }

    /**
     * 随机提取指定数量的元素,优先使用random.org网站的接口,如果出错则使用java的随机数算法
     *
     * @param list 集合
     * @param size 提取数量
     * @return 随机提取出来的元素集合
     */
    public static <T> List<T> random(List<T> list, int size) {
        if (list.size() <= size) {
            return list;
        }
        return randomByOriginal(list, size);
    }

//    public static void main(String[] args) {
//        List<String> strList = new ArrayList<String >();
//        for (int i = 0; i < 800; i++) {
//            strList.add("No." + (i + 1));
//        }
//        List<String> nums = random(strList, 3);
//        for (String num : nums) {
//            System.out.println(num);
//        }
//
//    }
}
